package com.sky.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sky.constant.MessageConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.exception.LoginFailedException;
import com.sky.mapper.UserMapper;
import com.sky.properties.WeChatProperties;
import com.sky.service.UserService;
import com.sky.utils.HttpClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.security.auth.login.LoginException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
    public static final String url = "https://api.weixin.qq.com/sns/jscode2session";

    @Autowired
    private WeChatProperties weChatProperties;
    @Autowired
    private UserMapper userMapper;

    @Override
    public User wxLogin(UserLoginDTO userLoginDTO) {
        //获取接收的用户信息，拿到用户的唯一标识openid，完成httpclaim自动 最重要的一点，唯一标识，用于注册新用户
        //自动完成注册用户功能，so，判断是否为新用户

        /**
         * 1调用微信端口服务，获得当前微信用户的openid   微信接口
         * https://api.weixin.qq.com/sns/jscode2session
         * 2、判断当前用户是否为空，空则异常
         * 3、判断是否为新用户，
         * 4、新用户：自动完成注册
         * 5、返回用户对象
         */

        //调用微信端口服务，获得当前微信用户的openid 所需要数据  可查看微信开发文档
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("appid", weChatProperties.getAppid());
        paramMap.put("secret", weChatProperties.getSecret());
        paramMap.put("js_code", userLoginDTO.getCode());
        paramMap.put("grant_type", "authorization_code");

        //向微信接口发出请求，并接收返回结果（可查看HttpClientUtil的实现机制）
        // 并且返回的数据doGet实际是一个JSON格式（ 可查看微信开发文档），而json格式里面就包含有用户唯一标识openid
        // https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
        String json = HttpClientUtil.doGet(url, paramMap);

        //试用json转换器获取到数据openid。再转回String格式的
        JSONObject jsonObject = JSON.parseObject(json);
        String openid = jsonObject.getString("openid");

        //判断openid是否为空，代表着是否已经获取到了
        if ((openid == null)) {
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }
        //正常，那么调用mapper层查询数据库是否为信用户
        User user = userMapper.select(openid);
        if (user == null) {
            //新用户
            user= User.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();
            userMapper.insert(user);
        }

        return user;
    }
}
